Загрузим файл о именах,поле и числе детей с сайта https://www.ssa.gov/oact/babynames/limits.html

Соберем все данные в одну таблицу.


In [1]:
import pandas as pd
import matplotlib.pyplot as plt
names1880 = pd.read_csv('/Users/kirill/Downloads/names/yob1880.txt', 
                        names= ['name', 'sex', 'births'])
names1880


Out[1]:
name sex births
0 Mary F 7065
1 Anna F 2604
2 Emma F 2003
3 Elizabeth F 1939
4 Minnie F 1746
5 Margaret F 1578
6 Ida F 1472
7 Alice F 1414
8 Bertha F 1320
9 Sarah F 1288
10 Annie F 1258
11 Clara F 1226
12 Ella F 1156
13 Florence F 1063
14 Cora F 1045
15 Martha F 1040
16 Laura F 1012
17 Nellie F 995
18 Grace F 982
19 Carrie F 949
20 Maude F 858
21 Mabel F 808
22 Bessie F 796
23 Jennie F 793
24 Gertrude F 787
25 Julia F 783
26 Hattie F 769
27 Edith F 768
28 Mattie F 704
29 Rose F 700
... ... ... ...
1970 Philo M 5
1971 Phineas M 5
1972 Presley M 5
1973 Ransom M 5
1974 Reece M 5
1975 Rene M 5
1976 Roswell M 5
1977 Rowland M 5
1978 Sampson M 5
1979 Samual M 5
1980 Santos M 5
1981 Schuyler M 5
1982 Sheppard M 5
1983 Spurgeon M 5
1984 Starling M 5
1985 Sylvanus M 5
1986 Theadore M 5
1987 Theophile M 5
1988 Tilmon M 5
1989 Tommy M 5
1990 Unknown M 5
1991 Vann M 5
1992 Wes M 5
1993 Winston M 5
1994 Wood M 5
1995 Woodie M 5
1996 Worthy M 5
1997 Wright M 5
1998 York M 5
1999 Zachariah M 5

2000 rows × 3 columns

Посчитаем количество родившихся в зависимости от пола


In [2]:
names1880.groupby('sex').sum()


Out[2]:
births
sex
F 90992
M 110491

In [3]:
# Для начала создадим новое поле year
years=range(1880,2017)

pieces = []
columns = [ 'name', 'sex', 'births' ]
for year in years:
    #меняем год в имени файла
    path = '/Users/kirill/Downloads/names/yob%d.txt' %year
    #читаем файл с полями
    frame = pd.read_csv(path, names=columns)
    #дописываем поле года
    frame['year'] = year
    #собираем в единый список
    pieces.append(frame)

#создаем DataFrame, внимание! игнорируем исходные номера строк  
names = pd.concat(pieces,ignore_index = True)
names


Out[3]:
name sex births year
0 Mary F 7065 1880
1 Anna F 2604 1880
2 Emma F 2003 1880
3 Elizabeth F 1939 1880
4 Minnie F 1746 1880
5 Margaret F 1578 1880
6 Ida F 1472 1880
7 Alice F 1414 1880
8 Bertha F 1320 1880
9 Sarah F 1288 1880
10 Annie F 1258 1880
11 Clara F 1226 1880
12 Ella F 1156 1880
13 Florence F 1063 1880
14 Cora F 1045 1880
15 Martha F 1040 1880
16 Laura F 1012 1880
17 Nellie F 995 1880
18 Grace F 982 1880
19 Carrie F 949 1880
20 Maude F 858 1880
21 Mabel F 808 1880
22 Bessie F 796 1880
23 Jennie F 793 1880
24 Gertrude F 787 1880
25 Julia F 783 1880
26 Hattie F 769 1880
27 Edith F 768 1880
28 Mattie F 704 1880
29 Rose F 700 1880
... ... ... ... ...
1891864 Zariyan M 5 2016
1891865 Zarren M 5 2016
1891866 Zaryn M 5 2016
1891867 Zaxon M 5 2016
1891868 Zaxtyn M 5 2016
1891869 Zaye M 5 2016
1891870 Zaymar M 5 2016
1891871 Zaymir M 5 2016
1891872 Zaynn M 5 2016
1891873 Zayshaun M 5 2016
1891874 Zedric M 5 2016
1891875 Zekariah M 5 2016
1891876 Zelan M 5 2016
1891877 Zephen M 5 2016
1891878 Zephyrus M 5 2016
1891879 Zeric M 5 2016
1891880 Zerin M 5 2016
1891881 Zethan M 5 2016
1891882 Zihao M 5 2016
1891883 Zimo M 5 2016
1891884 Zinn M 5 2016
1891885 Zirui M 5 2016
1891886 Ziya M 5 2016
1891887 Ziyang M 5 2016
1891888 Zoel M 5 2016
1891889 Zolton M 5 2016
1891890 Zurich M 5 2016
1891891 Zyahir M 5 2016
1891892 Zyel M 5 2016
1891893 Zylyn M 5 2016

1891894 rows × 4 columns

Теперь создадим первую сводную таблицу


In [4]:
total_births=names.pivot_table(
    'births', 
    index = 'year', # строки
    columns='sex',  # колонки
    aggfunc=sum     # сумма по births
)
total_births


Out[4]:
sex F M
year
1880 90992 110491
1881 91953 100743
1882 107847 113686
1883 112318 104627
1884 129020 114443
1885 133055 107799
1886 144533 110784
1887 145981 101415
1888 178624 120851
1889 178366 110581
1890 190376 111025
1891 185482 101191
1892 212339 122036
1893 212905 112317
1894 222922 115769
1895 233627 117396
1896 237918 119567
1897 234201 112757
1898 258769 122690
1899 233023 106211
1900 299810 150486
1901 239347 106470
1902 264076 122659
1903 261971 119234
1904 275364 128125
1905 291622 132315
1906 295303 133159
1907 318565 146830
1908 334313 154339
1909 347231 163999
... ... ...
1987 1738099 1865987
1988 1780123 1912979
1989 1843219 2000165
1990 1897940 2052780
1991 1874529 2019614
1992 1843446 1996571
1993 1808577 1960562
1994 1785246 1931383
1995 1758107 1903109
1996 1752455 1893664
1997 1740104 1884461
1998 1766237 1910601
1999 1772978 1919175
2000 1814922 1962744
2001 1799416 1941595
2002 1795556 1940095
2003 1825722 1973825
2004 1834632 1983271
2005 1845978 1995462
2006 1899166 2053065
2007 1920231 2072975
2008 1888177 2037309
2009 1834048 1980491
2010 1774186 1915331
2011 1755278 1895156
2012 1756347 1892094
2013 1749061 1885683
2014 1779496 1913434
2015 1776538 1907211
2016 1756647 1880674

137 rows × 2 columns

Построим график


In [5]:
total_births.plot(title='Общее количество роодившихся детей')
plt.show()


Давайте узнаем информацию о нашем DataFrame с именем names


In [6]:
names.info()
#names.info(memory_usage='deep')


<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1891894 entries, 0 to 1891893
Data columns (total 4 columns):
name      object
sex       object
births    int64
year      int64
dtypes: int64(2), object(2)
memory usage: 57.7+ MB

Отберем имена только мальчиков и девочек по повторяемости


In [7]:
grouped=names.groupby(['name','sex'])['births'].sum().reset_index()
grouped_m=grouped[grouped.sex=='M']
grouped_f=grouped[grouped.sex=='F']
grouped_f


Out[7]:
name sex births
1 Aabha F 35
4 Aabriella F 26
5 Aada F 5
9 Aaden F 5
15 Aadhira F 51
17 Aadhvika F 9
18 Aadhya F 1188
20 Aadi F 16
26 Aadison F 11
30 Aaditri F 37
35 Aadrika F 19
37 Aadriti F 5
38 Aadvi F 7
40 Aadvika F 33
41 Aadya F 876
42 Aadyn F 16
44 Aafia F 6
45 Aafiya F 6
46 Aafiyah F 5
47 Aafreen F 5
50 Aagna F 7
51 Aagot F 5
54 Aahana F 459
57 Aahliyah F 24
58 Aahna F 84
63 Aaila F 36
64 Aailiyah F 15
65 Aailyah F 184
66 Aaima F 54
67 Aaira F 128
... ... ... ...
106628 Zynaria F 10
106629 Zynasia F 74
106631 Zyndaya F 5
106632 Zynia F 180
106633 Zyniah F 173
106634 Zynique F 44
106635 Zyniya F 22
106636 Zyniyah F 52
106637 Zynovia F 6
106638 Zyon F 569
106640 Zyona F 104
106641 Zyonah F 12
106643 Zyonna F 428
106644 Zyonnah F 20
106651 Zyra F 438
106652 Zyrah F 171
106654 Zyree F 16
106662 Zyrhiana F 6
106663 Zyri F 6
106664 Zyria F 356
106665 Zyriah F 372
106667 Zyriana F 30
106668 Zyrianna F 41
106669 Zyrie F 19
106671 Zyriel F 16
106672 Zyrielle F 27
106673 Zyrihanna F 45
106676 Zyriyah F 16
106689 Zyva F 8
106692 Zyyanna F 6

66358 rows × 3 columns


In [9]:
most_popular_m=names[names.sex=='M'].drop('year',axis=1).groupby('name').sum().sort_values('births',ascending=False)
most_popular_m_10=most_popular_m[:10].reset_index()
most_popular_m_10


Out[9]:
name births
0 James 5136026
1 John 5105834
2 Robert 4809176
3 Michael 4338144
4 William 4087525
5 David 3601032
6 Joseph 2592856
7 Richard 2560771
8 Charles 2378806
9 Thomas 2297759

In [10]:
james_f=names[(names.name=='James') & (names.sex=='F')]
plt.plot(james_f['year'],james_f['births'])
plt.show()

james_m=names[(names.name=='James') & (names.sex=='M')]
plt.plot(james_m['year'],james_m['births'])
plt.show()


Домашнее задание

Простое задание

  1. Какую долю занимают 100 самых популярных имен среди остальных имен (отдельно для мальчиков и девочек)
  2. Построить график таких долей по годам

Средней сложности

  1. Найти одинаковые имена используемые для мальчиков и девочек
  2. Упорядочить имена по убыванию популярности
  3. Построить графики для трех первых по популярности таких имен - количетво рожденных по годам для мальчиков и девочек

Повышенной сложности

  1. Найти похожие имена по написанию, например Leslie, Lesley, Leslee, Lesli, Lesly и проследить измение половой принадлежности таких имен в зависимости от года

Срок исполнения:

  • Простое 1 неделя
  • Среднее 2 недели
  • Сложное, на дополнительные баллы 2 недели.

In [ ]: